/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.DAO;

import com.DAO.ConexaoPostgreSQL.ConnectionFactory;
import com.Model.AcervoConteudo;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Fellipe
 */
public class AcervoConteudoDAO {

    private Connection con = new ConnectionFactory().getConnection();
    private PreparedStatement pstm;

    public void create(AcervoConteudo ac) {

        try {

            String sql = "SELECT MAX(chaveacervoconteudo) + 1 AS maior FROM acervoconteudo";
            pstm = con.prepareStatement(sql);
            ResultSet rs = pstm.executeQuery();
            rs.next();
            int chaveAcervoConteudo = rs.getInt("maior");
            
            sql = "INSERT INTO acervoconteudo VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chaveAcervoConteudo);
            pstm.setInt(2, ac.getChaveRegistro());
            pstm.setInt(3, ac.getCampo().getChaveCampo());
            pstm.setString(4, ac.getValor());
            pstm.setString(5, ac.getArquivoLocal());
            pstm.setString(6, ac.getArquivoLocalOrigem());
            pstm.setString(7, ac.getNomeOrigem());
            pstm.setString(8, ac.getNomeDestino());
            pstm.setBytes(9, ac.getBlob());
            pstm.setString(10, ac.getRtf());
            pstm.execute();

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public List<AcervoConteudo> read(int chaveRegistro) {

        List<AcervoConteudo> listaConteudo = new ArrayList<AcervoConteudo>();

        try {

            String sql = "SELECT * FROM acervoconteudo WHERE registro = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chaveRegistro);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {

                AcervoConteudo ac = new AcervoConteudo();

                ac.setChaveConteudo(rs.getInt("chaveacervoconteudo"));
                ac.setChaveRegistro(rs.getInt("registro"));
                ac.setChaveCampo(rs.getInt("chavecampo"));
                ac.setValor(rs.getString("valor"));
                ac.setArquivoLocal(rs.getString("arquivolocal"));
                ac.setArquivoLocalOrigem(rs.getString("arquivolocalorigem"));
                ac.setNomeOrigem(rs.getString("nomeorigem"));
                ac.setNomeDestino(rs.getString("nomedestino"));
                ac.setBlob(rs.getBytes("blob"));
                ac.setRtf(rs.getString("rtf"));
                ac.setCampo(new CampoDAO().read(ac.getChaveCampo()));                
                
                listaConteudo.add(ac);

            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return listaConteudo;

    }

    public AcervoConteudo readUm(int chaveConteudo) {

        AcervoConteudo ac = new AcervoConteudo();

        try {

            String sql = "SELECT * FROM acervoconteudo WHERE chaveacervoconteudo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chaveConteudo);
            ResultSet rs = pstm.executeQuery();

            while (rs.next()) {
                ac.setChaveConteudo(rs.getInt("chaveacervoconteudo"));
                ac.setChaveRegistro(rs.getInt("registro"));
                ac.setChaveCampo(rs.getInt("chavecampo"));
                ac.setValor(rs.getString("valor"));
                ac.setArquivoLocal(rs.getString("arquivolocal"));
                ac.setArquivoLocalOrigem(rs.getString("arquivolocalorigem"));
                ac.setNomeOrigem(rs.getString("nomeorigem"));
                ac.setNomeDestino(rs.getString("nomedestino"));
                ac.setRtf(rs.getString("rtf"));
                ac.setBlob(rs.getBytes("blob"));
                ac.setCampo(new CampoDAO().read(ac.getChaveCampo()));
            }

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

        return ac;

    }

    public void update(AcervoConteudo ac) {

        try {

            String sql = "INSERT INTO acervoconteudo VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, ac.getChaveConteudo());
            pstm.setInt(2, ac.getChaveRegistro());
            pstm.setInt(3, ac.getChaveCampo());
            pstm.setString(4, ac.getValor());
            pstm.setString(5, ac.getArquivoLocal());
            pstm.setString(6, ac.getArquivoLocalOrigem());
            pstm.setString(7, ac.getNomeOrigem());
            pstm.setString(8, ac.getNomeDestino());

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }

    public void delete(int chaveAcervoConteudo) {

        try {

            String sql = "UPDATE acervoconteudo SET ativo = ? WHERE chaveacervoconteudo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setString(1, "0");
            pstm.setInt(2, chaveAcervoConteudo);

        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }

    }
    
    public List<AcervoConteudo> busca(String busca, int chave) {
        
        List<AcervoConteudo> listaACon = new ArrayList<AcervoConteudo>();
        
        try {
            
            String sql = "SELECT chaveacervo FROM campo WHERE chavecampo = ?";
            pstm = con.prepareStatement(sql);
            pstm.setInt(1, chave);
            ResultSet rs = pstm.executeQuery();
            
            rs.next();
            Integer chaveAc = rs.getInt("chaveacervo");
            
            sql = "SELECT * "
                    + "FROM acervoregistro INNER JOIN "
                    + "acervoconteudo ON acervoregistro.registro = acervoconteudo.registro INNER JOIN "
                    + "acervo ON acervoregistro.chaveacervo = acervo.chaveacervo "
                    + "WHERE (acervoconteudo.valor LIKE ?) AND (acervo.chaveacervo = ?)";
            pstm = con.prepareStatement(sql);
            pstm.setString(1, "%" + busca + "%");
            pstm.setInt(2, chaveAc);
            rs = pstm.executeQuery();
            
            while(rs.next()) {
                AcervoConteudo aCon = new AcervoConteudo();
                
                aCon.setValor(rs.getString("valor"));
                aCon.setChaveConteudo(rs.getInt("chaveacervoconteudo"));
                
                listaACon.add(aCon);                
                
            }
            
        } catch (SQLException ex) {
            System.out.println(ex);
        } finally {
            try {
                pstm.close();
                con.close();
            } catch (SQLException ex) {
                System.out.println("Não foi possivel terminar a conexão " + ex);
            }
        }
        
        return listaACon;
        
    }
}
